import sys
from pathlib import Path

from docutils.core import publish_cmdline
from invoke import task
from rellu import initialize_labels, ReleaseNotesGenerator, Version
from rellu.tasks import clean
from robot.libdoc import libdoc


assert Path.cwd() == Path(__file__).parent


REPOSITORY = "MarketSquare/SSHLibrary"
VERSION_PATH = Path("src/SSHLibrary/version.py")
VERSION_PATTERN = "VERSION = '(.*)'"
RELEASE_NOTES_PATH = Path("docs/SSHLibrary-{version}.rst")
RELEASE_NOTES_TITLE = "SSHLibrary {version}"
RELEASE_NOTES_INTRO = """
SSHLibrary_ is a `Robot Framework`_ test library for SSH and SFTP.
SSHLibrary {version} is a new release with
**UPDATE** enhancements and bug fixes.
All issues targeted for SSHLibrary {version.milestone} can be found from
the `issue tracker`_.

**REMOVE the previous note about all issues in the tracker with final
releases or otherwise if release notes contain all issues.**

**ADD more intro stuff if needed...**

**REMOVE ``--pre`` from the next command with final releases.**

If you have pip_ installed, just run

::

   pip install --pre --upgrade robotframework-sshlibrary

to install the latest release or use

::

   pip install robotframework-sshlibrary=={version}

to install exactly this version. Alternatively you can download the source
distribution from PyPI_ and install it manually.

SSHLibrary {version} was released on {date}.

.. _Robot Framework: http://robotframework.org
.. _SSHLibrary: https://github.com/MarketSquare/SSHLibrary
.. _pip: http://pip-installer.org
.. _PyPI: https://pypi.python.org/pypi/robotframework-sshlibrary
.. _issue tracker: https://github.com/MarketSquare/SSHLibrary/issues?q=milestone%3A{version.milestone}
"""


@task
def kw_docs(ctx):
    """Generates the library keyword documentation

    Documentation is generated by using the Libdoc tool.
    """
    libdoc(str(Path("src/SSHLibrary")), str(Path("docs/SSHLibrary.html")))


@task
def project_docs(ctx):
    """Generate project documentation.

    These docs are visible at http://robotframework.org/SSHLibrary/.
    """
    args = [
        "--stylesheet=style.css,extra.css",
        "--link-stylesheet",
        "README.rst",
        "docs/index.html",
    ]
    publish_cmdline(writer_name="html5", argv=args)
    print(Path(args[-1]).absolute())


@task
def set_version(ctx, version):
    """Set project version in `src/SSHLibrary/version.py`` file.

    Args:
        version: Project version to set or ``dev`` to set development version.

    Following PEP-440 compatible version numbers are supported:
    - Final version like 3.0 or 3.1.2.
    - Alpha, beta or release candidate with ``a``, ``b`` or ``rc`` postfix,
      respectively, and an incremented number like 3.0a1 or 3.0.1rc1.
    - Development version with ``.dev`` postfix and an incremented number like
      3.0.dev1 or 3.1a1.dev2.

    When the given version is ``dev``, the existing version number is updated
    to the next suitable development version. For example, 3.0 -> 3.0.1.dev1,
    3.1.1 -> 3.1.2.dev1, 3.2a1 -> 3.2a2.dev1, 3.2.dev1 -> 3.2.dev2.
    """
    version = Version(version, VERSION_PATH, VERSION_PATTERN)
    version.write()
    print(version)


@task
def print_version(ctx):
    """Print the current project version."""
    print(Version(path=VERSION_PATH, pattern=VERSION_PATTERN))


@task
def release_notes(ctx, version=None, username=None, password=None, write=False):
    """Generates release notes based on issues in the issue tracker.

    Args:
        version:  Generate release notes for this version. If not given,
                  generated them for the current version.
        username: GitHub username.
        password: GitHub password.
        write:    When set to True, write release notes to a file overwriting
                  possible existing file. Otherwise just print them to the
                  terminal.

    Username and password can also be specified using ``GITHUB_USERNAME`` and
    ``GITHUB_PASSWORD`` environment variable, respectively. If they aren't
    specified at all, communication with GitHub is anonymous and typically
    pretty slow.
    """
    version = Version(version, VERSION_PATH, VERSION_PATTERN)
    file = RELEASE_NOTES_PATH if write else sys.stdout
    generator = ReleaseNotesGenerator(
        REPOSITORY, RELEASE_NOTES_TITLE, RELEASE_NOTES_INTRO
    )
    generator.generate(version, username, password, file)


@task
def init_labels(ctx, username=None, password=None):
    """Initialize project by setting labels in the issue tracker.

    Args:
        username: GitHub username.
        password: GitHub password.

    Username and password can also be specified using ``GITHUB_USERNAME`` and
    ``GITHUB_PASSWORD`` environment variable, respectively.

    Should only be executed once when taking ``rellu`` tooling to use or
    when labels it uses have changed.
    """
    initialize_labels(REPOSITORY, username, password)
